//package com.snail.clouds.storage.providers.tianyi_tv;
//
//import cn.hutool.http.HttpRequest;
//import cn.hutool.http.HttpResponse;
//import cn.hutool.http.HttpUtil;
//import cn.hutool.crypto.digest.DigestAlgorithm;
//import cn.hutool.crypto.digest.Digester;
//import cn.hutool.core.date.DateUtil;
//import cn.hutool.core.util.StrUtil;
//import cn.hutool.core.util.RandomUtil;
//import cn.hutool.core.util.IdUtil;
//import cn.hutool.json.JSONUtil;
//import cn.hutool.core.map.MapUtil;
//
//import java.util.HashMap;
//import java.util.Map;
//import java.util.Date;
//import java.util.List;
//import java.util.ArrayList;
//import java.nio.charset.StandardCharsets;
//
///**
// * 天翼TV API封装类
// * 参考Python版本实现
// */
//public class TianyiTVAPi {
//
//    // 常量定义，参考Python实现
//    private static final String TV_APP_KEY = "600100885";
//    private static final String TV_APP_SIGNATURE_SECRET = "fe5734c74c2f96a38157f420b32dc995";
//    private static final String TV_VERSION = "6.5.5";
//    private static final String ANDROID_TV = "FAMILY_TV";
//    private static final String TV_CHANNEL_ID = "home02";
//    private static final String API_URL = "https://api.cloud.189.cn";
//
//    private Map<String, Object> tokenInfo;
//
//    public TianyiTVAPi() {
//        this.tokenInfo = new HashMap<>();
//    }
//
//    /**
//     * 获取二维码登录UUID
//     * 参考Python实现：get_qr_code_uuid
//     */
//    public Map<String, Object> getQrCodeUUID() {
//        try {
//            String url = API_URL + "/family/manage/getQrCodeUUID.action";
//
//            // 生成签名头
//            Map<String, String> headers = appKeySignatureHeader(url, "GET");
//
//            Map<String, Object> params = clientSuffix();
//
//            HttpResponse response = HttpRequest.get(url)
//                    .addHeaders(headers)
//                    .form(params)
//                    .timeout(10000, 60000)
//                    .execute();
//
//            if (response.getStatus() != 200) {
//                throw new RuntimeException("获取二维码UUID失败: " + response.getStatus());
//            }
//
//            String body = response.body();
//            if (body.startsWith("<?xml")) {
//                // 解析XML响应
//                // 简化处理，实际应该解析XML
//                Map<String, Object> result = new HashMap<>();
//                result.put("raw", body);
//                return result;
//            } else {
//                // 尝试解析JSON
//                return JSONUtil.toBean(body, Map.class);
//            }
//        } catch (Exception e) {
//            throw new RuntimeException("获取二维码UUID失败: " + e.getMessage(), e);
//        }
//    }
//
//    /**
//     * 检查二维码登录结果
//     * 参考Python实现：check_qr_code_login_result
//     */
//    public Map<String, Object> checkQrCodeLoginResult(String uuid) {
//        try {
//            String url = API_URL + "/family/manage/qrcodeLoginResult.action";
//
//            // 生成签名头
//            Map<String, String> headers = appKeySignatureHeader(url, "GET");
//
//            Map<String, Object> params = clientSuffix();
//            // 严格按照Python实现：直接使用完整的UUID（URL）
//            params.put("uuid", uuid);
//
//            HttpResponse response = HttpRequest.get(url)
//                    .addHeaders(headers)
//                    .form(params)
//                    .timeout(10000, 60000)
//                    .execute();
//
//            // 严格按照Python实现：先检查HTTP状态码
//            if (response.getStatus() != 200) {
//                if (response.getStatus() == 400 || response.getStatus() == 500) {
//                    // 尝试解析错误响应
//                    try {
//                        Map<String, Object> errorData = JSONUtil.toBean(response.body(), Map.class);
//                        // 检查是否是QrCodeRollLoginFail（等待状态）
//                        if ("QrCodeRollLoginFail".equals(errorData.get("res_code"))) {
//                            return null; // 返回null表示还在等待
//                        } else {
//                            throw new RuntimeException("API错误: " + errorData);
//                        }
//                    } catch (Exception jsonEx) {
//                        // 尝试解析XML错误
//                        String responseBody = response.body();
//                        if (responseBody.contains("<error>") && responseBody.contains("QrCodeRollLoginFail")) {
//                            return null; // 返回null表示还在等待
//                        } else {
//                            throw new RuntimeException("HTTP错误: " + response.getStatus() + ", 响应: " + responseBody);
//                        }
//                    }
//                } else {
//                    response.close();
//                }
//            }
//
//            // HTTP 200状态码，尝试解析响应
//            try {
//                Map<String, Object> result = JSONUtil.toBean(response.body(), Map.class);
//
//                // 检查是否包含错误信息
//                if (result.containsKey("res_code") && "QrCodeRollLoginFail".equals(result.get("res_code"))) {
//                    return null; // 返回null表示还在等待
//                }
//
//                // 检查是否包含accessToken（成功登录）
//                if (result.containsKey("accessToken") && StrUtil.isNotBlank((String) result.get("accessToken"))) {
//                    return result;
//                }
//
//                // 其他情况，返回原始结果
//                return result;
//            } catch (Exception jsonError) {
//                // 尝试解析XML
//                String responseBody = response.body();
//                if (responseBody.contains("<error>") && responseBody.contains("QrCodeRollLoginFail")) {
//                    return null; // 返回null表示还在等待
//                } else {
//                    // 返回原始文本
//                    Map<String, Object> result = new HashMap<>();
//                    result.put("raw", responseBody);
//                    return result;
//                }
//            }
//        } catch (Exception e) {
//            throw new RuntimeException("检查二维码登录结果失败: " + e.getMessage(), e);
//        }
//    }
//
//    /**
//     * 使用E189AccessToken登录获取SessionKey和SessionSecret
//     * 参考Python实现：login_family_merge
//     */
//    public Map<String, Object> loginFamilyMerge(String e189AccessToken) {
//        try {
//            String url = API_URL + "/family/manage/loginFamilyMerge.action";
//
//            // 生成签名头
//            Map<String, String> headers = appKeySignatureHeader(url, "GET");
//
//            Map<String, Object> params = clientSuffix();
//            params.put("e189AccessToken", e189AccessToken);
//
//            HttpResponse response = HttpRequest.get(url)
//                    .addHeaders(headers)
//                    .form(params)
//                    .timeout(10000, 60000)
//                    .execute();
//
//            response.closeIfNeed();
//
//            if (response.getStatus() != 200) {
//                throw new RuntimeException("登录合并失败: " + response.getStatus());
//            }
//
//            Map<String, Object> result = JSONUtil.toBean(response.body(), Map.class);
//            return result;
//        } catch (Exception e) {
//            throw new RuntimeException("登录合并失败: " + e.getMessage(), e);
//        }
//    }
//
//    /**
//     * 获取用户信息
//     * 参考Python实现：get_user_info
//     */
//    public Map<String, Object> getUserInfo(String accessToken) {
//        try {
//            String url = API_URL + "/getUserInfo.action";
//
//            // 生成签名头
//            Map<String, String> headers = signatureHeader(url, "GET", false);
//            headers.put("access_token", accessToken);
//
//            Map<String, Object> params = clientSuffix();
//
//            HttpResponse response = HttpRequest.get(url)
//                    .addHeaders(headers)
//                    .form(params)
//                    .timeout(10000, 60000)
//                    .execute();
//
//            response.closeIfNeed();
//
//            if (response.getStatus() != 200) {
//                throw new RuntimeException("获取用户信息失败: " + response.getStatus());
//            }
//
//            Map<String, Object> result = JSONUtil.toBean(response.body(), Map.class);
//
//            // 如果用户信息中没有容量信息，尝试获取容量信息
//            if (!result.containsKey("cloudCapacityInfo") && !result.containsKey("familyCapacityInfo")) {
//                try {
//                    Map<String, Object> capacityInfo = getCapacityInfo(accessToken);
//                    // 合并容量信息到用户信息中
//                    if (capacityInfo != null && capacityInfo.containsKey("cloudCapacityInfo")) {
//                        result.put("cloudCapacityInfo", capacityInfo.get("cloudCapacityInfo"));
//                    } else if (capacityInfo != null && capacityInfo.containsKey("familyCapacityInfo")) {
//                        result.put("familyCapacityInfo", capacityInfo.get("familyCapacityInfo"));
//                    }
//                } catch (Exception e) {
//                    // 忽略容量信息获取失败
//                }
//            }
//
//            return result;
//        } catch (Exception e) {
//            throw new RuntimeException("获取用户信息失败: " + e.getMessage(), e);
//        }
//    }
//
//    /**
//     * 获取文件列表
//     * 参考Python实现：get_files
//     */
//    public List<Map<String, Object>> listFiles(String folderId, String accessToken, boolean isFamily) {
//        try {
//            String url = API_URL + "/listFiles.action";
//            if (isFamily) {
//                url = API_URL + "/family/file/listFiles.action";
//            }
//
//            // 生成签名头
//            Map<String, String> headers = signatureHeader(url, "GET", isFamily);
//
//            Map<String, Object> params = clientSuffix();
//            params.put("folderId", folderId);
//            params.put("fileType", "0");
//            params.put("mediaAttr", "0");
//            params.put("iconOption", "5");
//            params.put("pageNum", "1");
//            params.put("pageSize", "130");
//
//            if (isFamily) {
//                params.put("familyId", MapUtil.getStr(tokenInfo, "familyId", ""));
//                params.put("orderBy", "createDate");
//                params.put("descending", "true");
//            } else {
//                params.put("recursive", "0");
//                params.put("orderBy", "createDate");
//                params.put("descending", "true");
//            }
//
//            HttpResponse response = HttpRequest.get(url)
//                    .addHeaders(headers)
//                    .form(params)
//                    .timeout(10000, 60000)
//                    .execute();
//
//            response.closeIfNeed();
//
//            if (response.getStatus() != 200) {
//                throw new RuntimeException("获取文件列表失败: " + response.getStatus());
//            }
//
//            Map<String, Object> result = JSONUtil.toBean(response.body(), Map.class);
//            List<Map<String, Object>> files = new ArrayList<>();
//
//            // 处理文件夹
//            if (result.containsKey("fileListAO") && ((Map<String, Object>) result.get("fileListAO")).containsKey("folderList")) {
//                List<Map<String, Object>> folderList = (List<Map<String, Object>>) ((Map<String, Object>) result.get("fileListAO")).get("folderList");
//                for (Map<String, Object> folder : folderList) {
//                    folder.put("isFolder", true);
//                    files.add(folder);
//                }
//            }
//
//            // 处理文件
//            if (result.containsKey("fileListAO") && ((Map<String, Object>) result.get("fileListAO")).containsKey("fileList")) {
//                List<Map<String, Object>> fileList = (List<Map<String, Object>>) ((Map<String, Object>) result.get("fileListAO")).get("fileList");
//                for (Map<String, Object> file : fileList) {
//                    file.put("isFolder", false);
//                    files.add(file);
//                }
//            }
//
//            return files;
//        } catch (Exception e) {
//            throw new RuntimeException("获取文件列表失败: " + e.getMessage(), e);
//        }
//    }
//
//    /**
//     * 创建文件夹
//     * 参考Python实现：create_folder
//     */
//    public Map<String, Object> createFolder(String name, String parentId, String accessToken, boolean isFamily) {
//        try {
//            String url = API_URL + "/createFolder.action";
//            if (isFamily) {
//                url = API_URL + "/family/file/createFolder.action";
//            }
//
//            // 生成签名头
//            Map<String, String> headers = signatureHeader(url, "POST", isFamily);
//
//            Map<String, Object> params = clientSuffix();
//            params.put("folderName", name);
//            params.put("relativePath", "");
//
//            if (isFamily) {
//                params.put("familyId", MapUtil.getStr(tokenInfo, "familyId", ""));
//                params.put("parentId", parentId);
//            } else {
//                params.put("parentFolderId", parentId);
//            }
//
//            HttpResponse response = HttpRequest.post(url)
//                    .addHeaders(headers)
//                    .form(params)
//                    .timeout(10000, 60000)
//                    .execute();
//
//            response.closeIfNeed();
//
//            if (response.getStatus() != 200) {
//                throw new RuntimeException("创建文件夹失败: " + response.getStatus());
//            }
//
//            Map<String, Object> result = JSONUtil.toBean(response.body(), Map.class);
//            return result;
//        } catch (Exception e) {
//            throw new RuntimeException("创建文件夹失败: " + e.getMessage(), e);
//        }
//    }
//
//    /**
//     * 获取文件下载链接
//     * 参考Python实现：get_download_url
//     */
//    public String getDownloadUrl(String fileId, String accessToken, boolean isFamily) {
//        try {
//            String url = API_URL + "/getFileDownloadUrl.action";
//            if (isFamily) {
//                url = API_URL + "/family/file/getFileDownloadUrl.action";
//            }
//
//            // 生成签名头
//            Map<String, String> headers = signatureHeader(url, "GET", isFamily);
//
//            Map<String, Object> params = clientSuffix();
//            params.put("fileId", fileId);
//
//            if (isFamily) {
//                params.put("familyId", MapUtil.getStr(tokenInfo, "familyId", ""));
//            } else {
//                params.put("dt", "3");
//                params.put("flag", "1");
//            }
//
//            HttpResponse response = HttpRequest.get(url)
//                    .addHeaders(headers)
//                    .form(params)
//                    .timeout(10000, 15000) // 连接超时10秒，读取超时15秒
//                    .execute();
//
//            response.closeIfNeed();
//
//            if (response.getStatus() != 200) {
//                throw new RuntimeException("获取下载链接失败: " + response.getStatus());
//            }
//
//            Map<String, Object> result = JSONUtil.toBean(response.body(), Map.class);
//            String downloadUrl = (String) result.getOrDefault("fileDownloadUrl", "");
//
//            // 处理重定向获取真实链接
//            if (StrUtil.isNotBlank(downloadUrl)) {
//                downloadUrl = downloadUrl.replace("&amp;", "&").replace("http://", "https://", 1);
//            }
//
//            return downloadUrl;
//        } catch (Exception e) {
//            throw new RuntimeException("获取下载链接失败: " + e.getMessage(), e);
//        }
//    }
//
//    /**
//     * 获取容量信息
//     * 参考Python实现：get_capacity_info
//     */
//    public Map<String, Object> getCapacityInfo(String accessToken) {
//        try {
//            String url = API_URL + "/portal/getUserSizeInfo.action";
//
//            // 生成签名头
//            Map<String, String> headers = signatureHeader(url, "GET", false);
//            headers.put("access_token", accessToken);
//
//            HttpResponse response = HttpRequest.get(url)
//                    .addHeaders(headers)
//                    .form(clientSuffix())
//                    .timeout(10000, 60000)
//                    .execute();
//
//            response.closeIfNeed();
//
//            if (response.getStatus() != 200) {
//                throw new RuntimeException("获取容量信息失败: " + response.getStatus());
//            }
//
//            Map<String, Object> result = JSONUtil.toBean(response.body(), Map.class);
//            return result;
//        } catch (Exception e) {
//            throw new RuntimeException("获取容量信息失败: " + e.getMessage(), e);
//        }
//    }
//
//    /**
//     * 获取客户端后缀参数
//     * 参考Python实现：_client_suffix
//     */
//    private Map<String, Object> clientSuffix() {
//        Map<String, Object> params = new HashMap<>();
//        params.put("clientType", ANDROID_TV);  // "FAMILY_TV"
//        params.put("version", TV_VERSION);
//        params.put("channelId", TV_CHANNEL_ID);
//        params.put("clientSn", "unknown");
//        params.put("model", "PJX110");
//        params.put("osFamily", "Android");
//        params.put("osVersion", "35");
//        params.put("networkAccessMode", "WIFI");
//        params.put("telecomsOperator", "46011");
//        return params;
//    }
//
//    /**
//     * 生成AppKey签名头
//     * 参考Python实现：_app_key_signature_header
//     */
//    private Map<String, String> appKeySignatureHeader(String url, String method) {
//        // 使用毫秒时间戳，与Python实现一致
//        long timestamp = System.currentTimeMillis();
//
//        // 生成签名
//        String signature = appKeySignatureOfHmac(
//                TV_APP_SIGNATURE_SECRET,
//                TV_APP_KEY,
//                method,
//                url,
//                timestamp
//        );
//
//        Map<String, String> headers = new HashMap<>();
//        headers.put("Timestamp", String.valueOf(timestamp));
//        headers.put("X-Request-ID", IdUtil.randomUUID());
//        headers.put("AppKey", TV_APP_KEY);
//        headers.put("AppSignature", signature);
//        return headers;
//    }
//
//    /**
//     * 生成SessionKey签名头
//     * 参考Python实现：_signature_header
//     */
//    private Map<String, String> signatureHeader(String url, String method, boolean isFamily) {
//        if (tokenInfo == null || tokenInfo.isEmpty()) {
//            throw new RuntimeException("Token信息未设置");
//        }
//
//        String dateStr = getHttpDateStr();
//        String sessionKey = MapUtil.getStr(tokenInfo, "sessionKey");
//        String sessionSecret = MapUtil.getStr(tokenInfo, "sessionSecret");
//
//        if (isFamily) {
//            sessionKey = MapUtil.getStr(tokenInfo, "familySessionKey");
//            sessionSecret = MapUtil.getStr(tokenInfo, "familySessionSecret");
//        }
//
//        // 生成签名
//        String signature = sessionKeySignatureOfHmac(
//                sessionSecret,
//                sessionKey,
//                method,
//                url,
//                dateStr
//        );
//
//        Map<String, String> headers = new HashMap<>();
//        headers.put("Date", dateStr);
//        headers.put("SessionKey", sessionKey);
//        headers.put("X-Request-ID", IdUtil.randomUUID());
//        headers.put("Signature", signature);
//        return headers;
//    }
//
//    /**
//     * 生成AppKey HMAC签名
//     * 参考Python实现：_app_key_signature_of_hmac
//     */
//    private String appKeySignatureOfHmac(String secret, String appKey, String method, String url, long timestamp) {
//        // 提取URL路径，与Python实现一致
//        String urlpath = url.replaceAll("https?://[^/]+", "");
//
//        // 构建签名字符串，与Python实现一致
//        String signString = "AppKey=" + appKey + "&Operate=" + method + "&RequestURI=" + urlpath + "&Timestamp=" + timestamp;
//
//        // 生成HMAC签名
//        Digester digester = new Digester(DigestAlgorithm.SHA1);
//        byte[] signatureBytes = digester.digest(signString, StandardCharsets.UTF_8);
//
//        StringBuilder sb = new StringBuilder();
//        for (byte b : signatureBytes) {
//            sb.append(String.format("%02X", b));
//        }
//        return sb.toString();
//    }
//
//    /**
//     * 生成SessionKey HMAC签名
//     * 参考Python实现：_session_key_signature_of_hmac
//     */
//    private String sessionKeySignatureOfHmac(String secret, String sessionKey, String method, String url, String date) {
//        // 提取URL路径，与Python实现一致
//        String urlpath = url.replaceAll("https?://[^/]+", "");
//
//        // 构建签名字符串，与Python实现一致
//        String signString = "SessionKey=" + sessionKey + "&Operate=" + method + "&RequestURI=" + urlpath + "&Date=" + date;
//
//        // 生成HMAC签名
//        Digester digester = new Digester(DigestAlgorithm.SHA1);
//        byte[] signatureBytes = digester.digest(signString, StandardCharsets.UTF_8, secret.getBytes(StandardCharsets.UTF_8));
//
//        StringBuilder sb = new StringBuilder();
//        for (byte b : signatureBytes) {
//            sb.append(String.format("%02X", b));
//        }
//        return sb.toString();
//    }
//
//    /**
//     * 获取HTTP日期字符串
//     * 参考Python实现：_get_http_date_str
//     */
//    private String getHttpDateStr() {
//        return DateUtil.format(new Date(), "EEE, dd MMM yyyy HH:mm:ss zzz");
//    }
//
//    // Getters and Setters
//    public Map<String, Object> getTokenInfo() {
//        return tokenInfo;
//    }
//
//    public void setTokenInfo(Map<String, Object> tokenInfo) {
//        this.tokenInfo = tokenInfo;
//    }
//}